home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr46 / strx221.zip / DYNSTREA.CPP < prev    next >
Text File  |  1993-03-01  |  2KB  |  96 lines

  1. //
  2. // dynstream.cpp : dynstream class implementation
  3. // Author  : Roy S. Woll
  4. //
  5. // Copyright (c) 1993 by Roy S. Woll
  6. // You may distribute this source freely as long as you leave all files
  7. // in their original form, including the copyright notice as is.
  8. //
  9. //
  10. // Version 2.00     11/30/92
  11. //    Override member function streambuf::sync()   Roy S. Woll
  12. //
  13. // Version 1.00     10/20/92
  14. //
  15. //
  16. #include <iostream.h>
  17. #include "str.h"
  18. #include "dynstream.h"
  19.  
  20. dynstreambuf::dynstreambuf(str* AstrPtr):
  21.       streambuf(),strPtr(AstrPtr)
  22. {
  23.    str::strdata * data = strPtr->data;
  24.    setNewBuffer(data->buf, data->cursize, data->curlength);
  25. };
  26.  
  27. // Create new buffer of size newbufsize
  28. char * dynstreambuf::getNewBuffer(int newbufsize)
  29. {
  30.    return strPtr->getNewBuffer(out_waiting(), newbufsize);
  31. };
  32.  
  33. // Use new buffer as specified by buf
  34. void dynstreambuf::setNewBuffer(char * buf, int newbufsize, int buflen)
  35. {
  36.    if (base()) buflen = (int)(pptr() - base());
  37.    setb(buf, buf+newbufsize, 0);
  38.    setp(buf, ebuf());
  39.    pbump(buflen);
  40. };
  41.  
  42. //
  43. // Called when buffer is full
  44. //
  45. int dynstreambuf::overflow(int c)
  46. {
  47.    if (!base())
  48.       if (!getNewBuffer(0)) return EOF;
  49.  
  50.    if (!pbase()) setp(base(), ebuf());
  51.  
  52.    if (pbase()){
  53.       if (pptr() >= epptr()) 
  54.          if (!getNewBuffer(0)) return EOF;
  55.       if (pptr() < epptr()) return sputc(c);
  56.    }
  57.    return EOF;
  58. };
  59.  
  60. streampos dynstreambuf::seekoff(streamoff offset, ios::seek_dir dir, int){
  61.    streamoff pos = EOF;
  62.  
  63.    if (dir == ios::end) pos = blen() + offset;
  64.    else if (dir == ios::beg) pos = offset;
  65.    else if (dir == ios::cur) {
  66.       if (!pptr()) pos = offset;
  67.       else pos = streamoff( (pptr()-base()) + offset);
  68.    };
  69.    if (pos < 0 || pos > blen()) return EOF;
  70.  
  71.    set_len(pos);
  72.    return streampos(pos);
  73. };
  74.  
  75. void dynstreambuf::set_len(int len){pbump(len- (pptr()-base()));};
  76.  
  77. void dynstreambuf::set_str(str* AstrPtr){ strPtr = AstrPtr;};
  78.  
  79. int dynstreambuf::sync(){ return 0; };
  80.  
  81. dynstream::~dynstream(void){ 
  82. #ifdef DEBUG_STR
  83.    str::dynstreamCount--;
  84. #endif
  85. };
  86.  
  87. dynstream::dynstream(str* AstrPtr)
  88.    :dynstreambase(AstrPtr),ostream(rdbuf())
  89. {
  90. #ifdef DEBUG_STR
  91.  str::dynstreamCount++;
  92. #endif
  93. };
  94.  
  95.  
  96.